home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Utilities / Random / Commodore 64c / SOURCE / Keyboard.c < prev    next >
Text File  |  1994-03-11  |  5KB  |  166 lines

  1. /*
  2.     Commodore 64 Emulator v0.1      Earle F. Philhower III 
  3.     Copyright (C) 1993-4            (st916w9r@dunx1.ocs.drexel.edu)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include "ProcessorTypes.h"
  20. #include "Keyboard.h"
  21. #include "Registers.h"
  22. #include "Flags.h"
  23. #include "Instructions.h"
  24. #include "Stack.h"
  25. #include "Modes.h"
  26. #include "Memory.h"
  27. #include "Vectors.h"
  28.  
  29. byte keyScan[8];
  30. byte scanCode[256];
  31.  
  32. void SetupScanCodes()
  33. {
  34.     int x, row;
  35.     byte y, z;
  36.     
  37.     for (x=0; x<256; x++){
  38.         z=255;
  39.         y=x^255;
  40.         if (y&1) z &=keyScan[0];
  41.         if (y&2) z &=keyScan[1];
  42.         if (y&4) z &=keyScan[2];
  43.         if (y&8) z &=keyScan[3];
  44.         if (y&16) z &=keyScan[4];
  45.         if (y&32) z &=keyScan[5];
  46.         if (y&64) z &=keyScan[6];
  47.         if (y&128) z &=keyScan[7];
  48.         scanCode[x]=z; }
  49. }
  50.  
  51. void AppleScanKeyboard(byte chr, int modifiers)
  52. {
  53.     keyScan[0]=keyScan[1]=keyScan[2]=keyScan[3]=keyScan[4]=keyScan[5]=
  54.     keyScan[6]=keyScan[7]=255;
  55.     if (chr==13) { keyScan[0] -=2;
  56.         if (modifiers&shiftKey) keyScan[1]-=128; return;}
  57.     if (chr==0x08) { keyScan[0] -= 1;
  58.                     if (modifiers&shiftKey) 
  59.                     keyScan[1]-=128; return; }/*del*/
  60.     if (chr==0x1b) { keyScan[7]-=128; return; }/*stop*/
  61.     if (chr=='`') { keyScan[7]-=128;
  62.         PushWord(pc);
  63.         Push(flags);
  64.         pc=WordAt(NMITo); }
  65.  
  66.     if (modifiers&optionKey) {
  67.         switch(chr) {
  68.             case 0xaa: keyScan[1]-=128;
  69.             case 0xc1: keyScan[0]-=16; break;
  70.             case 0xa2: keyScan[1]-=128;
  71.             case 0xa3: keyScan[0]-=32; break;
  72.             case 0xa4: keyScan[1]-=128;
  73.             case 0xb0: keyScan[0]-=64; break;
  74.             case 0xa5: keyScan[1]-=128;
  75.             case 0xa6: keyScan[0]-=8; break;}
  76.         return;}
  77.  
  78.     if (chr==' ') {
  79.         if (modifiers&shiftKey) keyScan[1]-=128;
  80.         keyScan[7]-=16;
  81.         return;}
  82.  
  83.     if ((chr>=1)&&(chr<=26)) {keyScan[7]-=4; chr +=64+32;}
  84.     
  85.     
  86.     
  87.     if (((chr>='A')&&(chr<='Z'))||((chr>='a')&&(chr<='z'))) {
  88.         if (chr<'a') keyScan[1] -= 128; else chr -=32;
  89.         if (chr<'N')
  90.             switch (chr) {
  91.             case 'A' : keyScan[1]-=4; break;
  92.             case 'B' : keyScan[3]-=16; break;
  93.             case 'C' : keyScan[2]-=16; break;
  94.             case 'D' : keyScan[2]-=4; break;
  95.             case 'E' : keyScan[1]-=64; break;
  96.             case 'F' : keyScan[2]-=32; break;
  97.             case 'G' : keyScan[3]-=4; break;
  98.             case 'H' : keyScan[3]-=32; break;
  99.             case 'I' : keyScan[4]-=2; break;
  100.             case 'J' : keyScan[4]-=4; break;
  101.             case 'K' : keyScan[4]-=32; break;
  102.             case 'L' : keyScan[5]-=4; break;
  103.             case 'M' : keyScan[4]-=16; break;}
  104.         else
  105.             switch (chr) {
  106.             case 'N' : keyScan[4]-=128; break;
  107.             case 'O' : keyScan[4]-=64; break;
  108.             case 'P' : keyScan[5]-=2; break;
  109.             case 'Q' : keyScan[7]-=64; break;
  110.             case 'R' : keyScan[2]-=2; break;
  111.             case 'S' : keyScan[1]-=32; break;
  112.             case 'T' : keyScan[2]-=64; break;
  113.             case 'U' : keyScan[3]-=64; break;
  114.             case 'V' : keyScan[3]-=128; break;
  115.             case 'W' : keyScan[1]-=2; break;
  116.             case 'X' : keyScan[2]-=128; break;
  117.             case 'Y' : keyScan[3]-=2; break;
  118.             case 'Z' : keyScan[1]-=16; break;}
  119.         }
  120.     else if ((chr>='0')&&(chr<='9'))
  121.         switch(chr) {
  122.             case '0': keyScan[4]-=8; break;
  123.             case '1': keyScan[7]-=1; break;
  124.             case '2': keyScan[7]-=8; break;
  125.             case '3': keyScan[1]-=1; break;
  126.             case '4': keyScan[1]-=8; break;
  127.             case '5': keyScan[2]-=1; break;
  128.             case '6': keyScan[2]-=8; break;
  129.             case '7': keyScan[3]-=1; break;
  130.             case '8': keyScan[3]-=8; break;
  131.             case '9': keyScan[4]-=1; break; }
  132.     else if ((chr>=0x1c)&&(chr<=0x1f))
  133.         switch (chr) {
  134.             case 0x1c: keyScan[1] -=128; keyScan[0] -=4; break;
  135.             case 0x1d: keyScan[0] -=4; break;
  136.             case 0x1e: keyScan[1] -=128; keyScan[0] -=128; break;
  137.             case 0x1f: keyScan[0] -=128; break; }
  138.     else if ((chr>='!')&&(chr<='/'))
  139.         switch (chr) {
  140.             case '!': keyScan[1] -=128; keyScan[7] -=1; break;
  141.             case '"': keyScan[1] -=128; keyScan[7] -=8; break;
  142.             case '#': keyScan[1] -=128; keyScan[1] -=1; break;
  143.             case '$': keyScan[1] -=128; keyScan[1] -=8; break;
  144.             case '%': keyScan[1] -=128; keyScan[2] -=1; break;
  145.             case '&': keyScan[1] -=128; keyScan[2] -=8; break;
  146.             case 39 : keyScan[1] -=128; keyScan[3] -=1; break;
  147.             case '(': keyScan[1] -=128; keyScan[3] -=8; break;
  148.             case ')': keyScan[1] -=128; keyScan[4] -=1; break;
  149.             case '*': keyScan[6] -=2; break;
  150.             case '+': keyScan[5] -=1; break;
  151.             case ',': keyScan[5] -=128; break;
  152.             case '-': keyScan[5] -=8; break;
  153.             case '.': keyScan[5] -=16; break;
  154.             case '/': keyScan[6] -=128; break;
  155.             }
  156.     else if ((chr>=':')&&(chr<='@')) 
  157.         switch (chr) {
  158.             case ';': keyScan[6]-=4;
  159.             case ':': keyScan[5]-=32; break;
  160.             case '<': keyScan[1]-=128; keyScan[5]-=128; break;
  161.             case '=': keyScan[6]-=32; break;
  162.             case '>': keyScan[1]-=128; keyScan[5]-=16; break;
  163.             case '?': keyScan[1]-=128; keyScan[6]-=128; break;
  164.             case '@': keyScan[5]-=64; break;}
  165. }
  166.